

/**
 * 批量上传费率处理函数 - 私家车意外险
 */
const fs = require('fs');
const XLSX = require('xlsx');
const request = require('request');

//1. 入参：产品编号 + 基本保费 +  数据表格 + 表头配置
//2. 读取文件，计算数据规模，并记录行数与列数
//3. 解析文件，从行到单元格，并保存到数组
//4. 上传数据，同时打印批处理的总数
//5. 异常处理，抛出错误让前端检查

var workbook, // 读取 exel 得到的 文件流
    productId, // 产品id
    productBase, // 基本保额
    lines, // 行数
    columns, // 列数
    table, // 整个 exel 文件
    columnList, // 每一列代表的信息
    rateList;

function init(data) {

    reset();

    productId = data.productIdOfRate;
    productBase = data.productBase;
    columnList = data.columnList;

    console.log(`\n 开始：读取产品编号为 ${productId} 的费率表...\n`);

    // 拿到文件名，并获取文件
    workbook = XLSX.readFile('static/' + data.downloadUrl);

    getStruct(workbook);

    // 开始读取 exel 文件
    readExel();

    return "读取 exel 中"
    // return uploadData();
}

// 初始化参数
function reset() {
    workbook = null;
    productId = 0;
    productBase = 0;
    lines = 0;
    columns = 0;
    table = {};
    columnList = [];
    rateList = [];
}


// 获取 exel 文件 的 结构
function getStruct(wb) {

    table = wb.Sheets[wb.SheetNames[0]]; // 默认只取第一个Sheet

    let ref = table['!ref']; // 选定数据区域，如：A1:C109
    let columnMax = ref.split(':')[1]; // 最后一个单元格，如：C109

    lines = parseInt(/\d{1,4}$/.exec(columnMax)[0]); // 行数，如：109
    columns = /^[A-Z]/.exec(columnMax)[0].charCodeAt() - 64; // 列数，从字母转成数字 如：2

    console.log(`\n 进度：读取此产品的结构：${lines} 行，${columns} 列`);

}


/**
 * 计算单元格坐标，A1，B2
 * 
 * @param {*} x ：横坐标 ，比如A
 * @param {*} y ：纵坐标，比如2
 */
function getPosition(x, y) {

    // 转成大写字母，A，所以加64
    let pos_letter = String.fromCharCode(64 + x);
    let pos_number = y;

    return pos_letter + pos_number;
}



// 把解析的 exel 的每一条记录保存起来
function pushToList(age, sexId, premiumPaymentPeriod, price) {

    // productBase 基本保额
    price = price / productBase * 10000; //折算成10000元基本保费

    rateList.push({
        "productId": productId,
        "age": age,
        "premiumPaymentPeriod": premiumPaymentPeriod,
        "sexId": sexId,
        "price": price
    });

}



/**
 * 解析 exel 文件
 * 行数 是 数字，i
 * 列数 是 大写字母，A，B
 */
function readExel() {
    
    // 从 1 开始，因为最小是 1，没有第 0 行
    for (let i = 1; i <= lines; i++) {

        let A_info=table['A' + i]

        if (!A_info) {
            continue;
        }

        let age = A_info.v; // 年龄无法修改，固定在第一位
        
        // 没有第一列 + age占了一列，所以从 2 开始
        for (let j = 2; j <= columns; j++) {

            let position = getPosition(j, i); // 计算单元格坐标
            let table_pos=table[position]

            if (!table_pos) {
                continue;
            }
            
            // 每一个格子都是价格
            let price = table_pos.v; //获得单元格数据

            // columnList 
            // [{sexId: 1, premiumPaymentPeriod: "20"}]
            let columnConf=columnList[j - 2]

            //通过配置获得性别编号
            let sexId = columnConf.sexId; 

            //缴纳年份
            let premiumPaymentPeriod = columnConf.premiumPaymentPeriod; 

            console.log(`\n 进度：读取第 ${i} 行，年龄为 ${age}, ${sexId}, 价格 ${price}, 年限 ${premiumPaymentPeriod}`);

            pushToList(age, sexId, premiumPaymentPeriod, price); //保存数据到列表

        }
    }

    console.log(`\n 进度：读取完毕，共计${rateList.length}条费率\n`);
}


// 上传费率表给 java 后台
function uploadData(rates) {

    console.log(`\n 进度：开始批量上传费率表`);

    return new Promise((resolve, reject) => {

        request({
            url: 'http://www.biyibibaoxian.com/java/api/rates_list',
            method: "POST",
            json: true,
            headers: {
                "content-type": "application/json",
                "Accept": "*/*"
            },
            body: rateList

        }, function (error, response, body) {

            if (!error && response.statusCode == 200 || response.statusCode == 201) {

                console.log(`\n结束：上传成功，共计${rateList.length}条`);

                resolve({
                    code: 0,
                    data: {
                        id: productId,
                        length: rateList.length
                    }
                });
            } else {

                console.log(`\n 错误：上传失败，服务端错误`);

                reject({
                    code: -1,
                    msg: '接口错误：api/rates_list'
                });

            }
        });
    });

}


module.exports = init
